整数用补码表示,但实数范围极大且小数位可变,需用"科学计数法"式的浮点表示。本文整理 IEEE 754 标准下单精度/双精度浮点的组成、转换、特殊值与精度问题。
定点数(小数点位置固定)无法同时表示极大与极小的数,且精度固定。浮点数借鉴科学计数法,用指数调节小数点位置,以有限的位表示跨度极大的数值范围。
科学计数法形式:
[ N = \pm M \times 2^E ]
IEEE 754 是浮点数的行业标准,常见两种:
| 类型 | 总位宽 | 符号位 S | 阶码 E | 尾数 M | 数值范围(约) | 精度 |
|---|---|---|---|---|---|---|
| 单精度 float | 32 | 1 | 8 | 23 | (\pm3.4\times10^{38}) | 约 7 位十进制 |
| 双精度 double | 64 | 1 | 11 | 52 | (\pm1.8\times10^{308}) | 约 15-16 位十进制 |
关键设计:
例:(6.5) 转单精度。
0 10000001 10100000000000000000000。0 10000001 10100000000000000000000:
IEEE 754 用阶码全 0 / 全 1 表示特殊值:
| 阶码 | 尾数 | 含义 |
|---|---|---|
| 全 0 | 全 0 | (\pm0) |
| 全 0 | 非 0 | 非规格化数(denormal,最小精度以下) |
| 全 1 | 全 0 | (\pm\infty)(无穷大) |
| 全 1 | 非 0 | NaN(Not a Number,如 0/0) |
-0,且 -0 == +0 为 true,但 1/-0 = -∞。十进制的 0.1 转二进制是无限循环小数((0.0001100110011\cdots)),存储时被截断,产生舍入误差。
0.1 + 0.2 # 输出 0.30000000000000004这是浮点数的固有局限,不是 bug。理解此点对工程至关重要。
== 比较浮点数,应比较差的绝对值是否小于阈值:
abs(a - b) < 1e-9Decimal),或用整数表示最小单位(分)。16777216.0 + 1.0 在 float 下等于 16777216.0,因为 24 位有效位无法表示 +1 的增量。大数与极小数的加法可能被"吞掉"。